/**
 * 给定红蓝金币，每个金币有一个币值，问要凑出面值P且红蓝均有的方案总数
 * 典型的01背包，首先求出所有方案总数，再求出只有蓝的，再求出只有红的
 * 相减即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

llt const MOD = 1000000000 + 7LL;

int N;
vi A;
int P;
string S;

llt proc(){
    vector<llt> d(P + 1, -1);
    d[0] = 1;
    for(int i=1;i<=N;++i){
        for(int v=P;v>=A[i];--v){
            if(-1 == d[v]){
                d[v] = d[v - A[i]];
            }else if(-1 != d[v-A[i]]){
                d[v] = (d[v] + d[v - A[i]]) % MOD;
            }
        }
    }

    if(-1 == d[P]) return 0;

    auto ans = d[P];

    d.assign(P + 1, -1);
    d[0] = 1;
    for(int i=1;i<=N;++i){
        if(S[i] == 'R') continue;
        for(int v=P;v>=A[i];--v){
            if(-1 == d[v]){
                d[v] = d[v - A[i]];
            }else if(-1 != d[v-A[i]]){
                d[v] = (d[v] + d[v - A[i]]) % MOD;
            }
        }
    }
    
    if(-1 != d[P]) ans = (ans - d[P]) % MOD;
    
    d.assign(P + 1, -1);
    d[0] = 1;
    for(int i=1;i<=N;++i){
        if(S[i] == 'B') continue;
        for(int v=P;v>=A[i];--v){
            if(-1 == d[v]){
                d[v] = d[v - A[i]];
            }else if(-1 != d[v-A[i]]){
                d[v] = (d[v] + d[v - A[i]]) % MOD;
            }
        }
    }    

    if(-1 != d[P]) ans = (ans - d[P]) % MOD;
    if(ans < 0) ans += MOD;
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofakse = 1;
    // cin >> nofakse;
    while(nofakse--){
        cin >> N >> P >> S;
        S = " " + S;
        A.assign(N + 1, 0);
        for(int i=1;i<=N;++i)cin>>A[i];
        cout << proc() << endl;
    }
    return 0;
}